以前唸書時,跟幾位化工所的朋友特別要好。當時曾經問過他們,所謂的『化學系』跟『化工系』難道不是一樣的東西嗎?得到的回答是:『化學注重的是化學本身,化工重視的是化學工業生產過程中,從原料到成品中間的所有製作的工程。』那時的我有聽沒有懂,因為在我的世界裡,『資訊工程』就是寫程式,頂多學學演算法或DSP等數學理論,什麼工程不工程的,我可是一點概念都沒有。
出社會,待了幾間老外開的軟體公司,這才知道,所謂的『軟體』,跟『軟體工程』根本就是兩回事,寫了好的軟體,在現代的資訊業界根本就是基本功中的基本功,把軟體生產的『工程』做好,那才是學問。然而跟幾位同在業界的同學聊天,才知道,在台灣的業界,雖然能做世界頂尖軟體的公司很多,但是能夠做到流暢的『軟體工程』的卻是少之又少。要不,就是自以為自己流暢,然後靠著基層員工加班賣肝,創造出一波又一波的經濟奇蹟,aka國民生產毛額。重點這些勞工還蠻自願的...
不過關於勞工自願過勞這件事,不是本文重點。那是完全另外的故事了...
我想說的是,你是否在日復一日夜復一夜的加班賣肝過程中,抱怨為什麼明明外面的世界已經有很多方便的工具,先進的技術,老闆和主管卻依舊強迫我用20年前的技術與程式風格硬刻,不准我求新求變?答案很簡單:『They don't care!』雖然殘酷卻很真實。沒別的,既然20年前那一套幫助公司成長茁壯到今天的地位,那他有什麼理由非變不可?你的心情和肝指數,根本就不是公司的營業目標。培養出聰明又方便工作的環境,對主管的KPI一點幫助都沒有,反正每年每年資工系畢業宅男多如過江之鯽,你的肝根本就不值錢!
於是,不要再死腦筋了,我不是說好的軟體工程不重要,而是你不要再傻傻的坐著等公司哪一天頓悟後開始推動了。記住,好的持續集成與自動化,不是為了公司著想(雖然公司也會因此得益),而是為了拯救你的肝(還有腦神經)!
好,我們知道要為了自己做好持續集成與自動化了,那我要從哪裡開始?Well, ...
怎麼說呢?首先你得先想想,在你的日常生活中,什麼事讓你感到最痛苦,痛苦的事,就讓他提早發生。舉個例吧!這是我見過的實際案例。
在筆者曾經待過的某個團隊裡,用的是git flow管理分枝,用了一段時間,同事發現奇怪,每次在feature branch上都運行得好好的,為什麼每次一回到develop,光是merge就讓人頭痛!就有人質疑了:『是不是因為git不好用啊?』嘖...
『哇哩咧,你才不好用,你全家都不好用!』
了解後才知道,該團隊每次開出去的branch都有至少一個月的壽命,長壽者甚至可以活超過半年!天啊!那當然不好用啊!所以我們後來就規定,feature branch壽命最多不可以超過一週,太長壽的branch就代表任務的粒度太大,必須得拆成更小的任務。目的就是要讓痛苦的merge過程『頻繁、小規模』地發生。如此一來,每次的主線更動程度,才能控制在可預期範圍內,把風險降至最小,痛苦指數降到最低。
再舉個例子。
在正式環境部署,向來都是張力高並且有風險的。尤其是當你這次的升版有大幅度的修改的時候。怎麼辦?請注意,現在是21世紀,我們還是要盡量用21世紀的思維來思考。還記得我們git flow的故事嗎?一樣地,這種有風險的事,就是要頻繁地做。怎麼做?
想個辦法把過版的流程整理成幾個腳本,然後每次過版都只執行這些腳本,並且嚴格禁止在正式環境上做任何手動操作,然後提高過版的頻率,讓版本與版本之間的功能差距縮小。『那多危險?萬一腳本錯了怎麼辦?風險豈不更高?』非也,非也。正是因為腳本錯了就會造成很大的風險,才要每次都用同一套腳本去執行。
試想,你自己的名字你從小到大寫過這麼多次,還會寫錯嗎?OK也許會,但總是比起每次都寫不同的名字還要熟練許多吧?也就是說,每次執行正式環境過版時,那個腳本早就已經被驗證過幾百次了,正確性肯定比手打指令來得高多了。也許還是可能會有打錯指令的時候,但是你想,『是打一行永遠固定的指令容易錯,還是打10~15行每次都不太一樣的指令容易錯?』不然,你看當初唐伯虎怎麼靠著那幅臨時畫的『春樹秋霜圖』騙過寧皇?還不是就靠著畫過幾百次的熟練度?
更何況,既然是腳本,那一定也可以執行檢查的指令吧?腳本可是不會累也不會帶感情的,他也不會因為跟你有私交就幫你掩蓋新版程式無法啟動的事實,一旦執行後有任何錯誤,看你是要叫他停下來還是要回朔,任你決定嚕!腳本你寫的嘛。至於腳本能不能越來越精進與安全...
這,就要看你『持續改善』的功力了...
由此可知收個知心的徒弟多重要。你看,曾子就很瞭他的老師,夫子一講,他馬上就懂了:『夫子之道,忠恕而已矣。』前面講這麼多屁話,舉了例子,也講了理論,其實重點只有一個:『越是痛苦的事,就讓他提早、頻繁地發生。』原因很簡單,人會出錯,人會累,也會害怕。
為什麼害怕?因為未知。對於大幅度的變動,以及不熟悉的事物。人多多少少會感到害怕,這是很正常的。於是,即便現在有敏捷開發、DevOps、CI/CD等技術與討論,其實萬變不離其宗,就是希望在軟體生產的『工程』中,透過頻繁、小幅度的更動,降低風險,提高可控制度,甚至在有變化來臨時,提早掌握時機,轉變方向,消極者減少損失,積極者提高利潤。
不做,不會怎樣;做了,很不一樣!